<!DOCTYPE html><html><head><meta charset="utf-8"><style>html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }

body{
  color:#444;
  font-family:Georgia, Palatino, 'Palatino Linotype', Times, 'Times New Roman',
              "Hiragino Sans GB", "STXihei", "微软雅黑", serif;
  font-size:12px;
  line-height:1.5em;
  background:#fefefe;
  width: 45em;
  margin: 10px auto;
  padding: 1em;
  outline: 1300px solid #FAFAFA;
}

a{ color: #0645ad; text-decoration:none;}
a:visited{ color: #0b0080; }
a:hover{ color: #06e; }
a:active{ color:#faa700; }
a:focus{ outline: thin dotted; }
a:hover, a:active{ outline: 0; }

span.backtick {
  border:1px solid #EAEAEA;
  border-radius:3px;
  background:#F8F8F8;
  padding:0 3px 0 3px;
}

::-moz-selection{background:rgba(255,255,0,0.3);color:#000}
::selection{background:rgba(255,255,0,0.3);color:#000}

a::-moz-selection{background:rgba(255,255,0,0.3);color:#0645ad}
a::selection{background:rgba(255,255,0,0.3);color:#0645ad}

p{
margin:1em 0;
}

img{
max-width:100%;
}

h1,h2,h3,h4,h5,h6{
font-weight:normal;
color:#111;
line-height:1em;
}
h4,h5,h6{ font-weight: bold; }
h1{ font-size:2.5em; }
h2{ font-size:2em; border-bottom:1px solid silver; padding-bottom: 5px; }
h3{ font-size:1.5em; }
h4{ font-size:1.2em; }
h5{ font-size:1em; }
h6{ font-size:0.9em; }

blockquote{
color:#666666;
margin:0;
padding-left: 3em;
border-left: 0.5em #EEE solid;
}
hr { display: block; height: 2px; border: 0; border-top: 1px solid #aaa;border-bottom: 1px solid #eee; margin: 1em 0; padding: 0; }


pre , code, kbd, samp { 
  color: #000; 
  font-family: monospace; 
  font-size: 0.88em; 
  border-radius:3px;
  background-color: #F8F8F8;
  border: 1px solid #CCC; 
}
pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; padding: 5px 12px;}
pre code { border: 0px !important; padding: 0;}
code { padding: 0 3px 0 3px; }

b, strong { font-weight: bold; }

dfn { font-style: italic; }

ins { background: #ff9; color: #000; text-decoration: none; }

mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }

sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sup { top: -0.5em; }
sub { bottom: -0.25em; }

ul, ol { margin: 1em 0; padding: 0 0 0 2em; }
li p:last-child { margin:0 }
dd { margin: 0 0 0 2em; }

img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }

table { border-collapse: collapse; border-spacing: 0; }
td { vertical-align: top; }

@media only screen and (min-width: 480px) {
body{font-size:14px;}
}

@media only screen and (min-width: 768px) {
body{font-size:16px;}
}

@media print {
  * { background: transparent !important; color: black !important; filter:none !important; -ms-filter: none !important; }
  body{font-size:12pt; max-width:100%; outline:none;}
  a, a:visited { text-decoration: underline; }
  hr { height: 1px; border:0; border-bottom:1px solid black; }
  a[href]:after { content: " (" attr(href) ")"; }
  abbr[title]:after { content: " (" attr(title) ")"; }
  .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
  pre, blockquote { border: 1px solid #999; padding-right: 1em; page-break-inside: avoid; }
  tr, img { page-break-inside: avoid; }
  img { max-width: 100% !important; }
  @page :left { margin: 15mm 20mm 15mm 10mm; }
  @page :right { margin: 15mm 10mm 15mm 20mm; }
  p, h2, h3 { orphans: 3; widows: 3; }
  h2, h3 { page-break-after: avoid; }
}
</style></head><body><h1 id="1-restful-api">1. Restful API</h1>

<p>A RESTful API is a (usually Web) service that exposes its functionality as Resources. REST maps greatly with HTTP verbs, which allow basic CRUD operations along with a few other practical things such as the recent PATCH verb, and HEAD, to get information about the resource.</p>

<p>Advantages include a clean and stable API. The verbs are basically always the same, and when using emerging standards such as HAL, a REST api basically becomes self-describing. Any resources points to itself and related resources, along with possible actions against it. Since the HTTP transport has all the facilities necessary for authentication, paging, localization and content negociation, it is easy for anyone that knows the Web to get it. It also makes payload lighter.</p>

<p>Some disadvantages are also there. There is no standard way of describing the API (such as a WSDL file for SOAP) and clients need to know about the resources and what properties they contain.</p>

<h1 id="2-json-jsonp-and-xml">2. JSON, JSONP and XML</h1>

<ul>
<li>JSON is a markup language that is very similar (but not 100% compatible) to JavaScript's Object Notation.</li>
<li>JSONP is a way to get JSON over HTTP for easier cross domain requests. It is basically JSON wrapper inside a JavaScript callback.</li>
<li>XML is a markup language based on SGML, but it is much stricter. It includes many features for extensibility such as namespaces.</li>
</ul>

<p>I have also worked with YAML, which is an indentation based markup language, mostly used by Python and Ruby frameworks.</p>

<h1 id="3-mvc">3. MVC</h1>

<p>MVC stands for Model View Controller. Controllers receive requests from the UI (a GUI framework or a Web browser), use the model to query or modify data and then return control to the UI. In the case of a browser, the interaction is mostly stateless, while in Desktop application, the view will sometimes use the controller to execute commands or get data.</p>

<p>I've worked with Rails, Django a tiny bit and extensively with asp.NET MVC (1 through 4).</p>

<h1 id="4-database-schema">4. Database schema</h1>

<p>Assuming it's a "blog" style application.</p>

<p><strong>Table "Posts":</strong></p>

<ul>
<li>Id INT NOT NULL PRIMARY KEY IDENTITY(1, 1)</li>
<li>Header NVARCHAR(MAX) NOT NULL</li>
<li>Body NVARCHAR(MAX) NOT NULL</li>
<li>Author NVARCHAR(MAX) NOT NULL</li>
<li>Timestamp DATETIME NOT NULL</li>
</ul>

<p><strong>Table "Tags":</strong></p>

<ul>
<li>Id INT NOT NULL PRIMARY KEY IDENTITY(1, 1)</li>
<li>Tag NVARCHAR(250) NOT NULL</li>
</ul>

<p><strong>Table "PostTags":</strong></p>

<ul>
<li>PostId INT NOT NULL FOREIGN KEY REFERENCES Posts (Id)</li>
<li>TagId INT NOT NULL FOREIGN KEY REFERENCES Tags (Id)</li>
<li>PRIMARY KEY (PostID, TagId)</li>
</ul>

<p>I would probably create a REST api because it already has support for caching and provides a great interoperable transport (HTTP) which can be used by server apps, mobile applications or desktop applications.</p>

<p><strong>Resource "/posts"</strong></p>

<ul>
<li>Lists the latest 10 posts (use Range header or whichever one is appropriate for paging if necessary)</li>
<li>Each post resource points to its tags</li>
<li>Query string parameters could be used to filter according to timestamp, author or keywords</li>
</ul>

<p><strong>Sub resource "/posts/{id}/tags"</strong></p>

<ul>
<li>Gets the tags for a specific post.</li>
</ul>

<p>This would allow an MVC application to easily get a post and its tags. A mobile web site could also directly query the API for maximum efficiency.</p>

<p>I actually cannot tell what mapping and indexing refer to in the question. If indexing means Database indices, I'd probably use a profiling tool to figure out which queries require optimization and optimize them specifically.</p>

<h1 id="5-automatic-keyword-generation">5. Automatic keyword generation</h1>

<p>A basic implementation would go through all posts, split them all into words. Remove the small, recurrent words from a dictionary of the language of the posts (e.g. "the", "a", "in"). Remove most common verbs as well.</p>

<p>Then, count each word and assign them a score according to their global frequency and frequency within a post. Assign more points for words inside a header. Pick the 5~10 highest scoring ones.</p>

<h1 id="6-phone-number-changing">6. Phone number changing</h1>

<p>I would start by wondering who hard-coded telephone formats in 10,000 HTML, then I'd start working on a RegEx that finds the phone numbers. Probably by looking at a few sample pages and making sure the Regex gets all the whitespace, periods and parentheses that are in numbers. Then, do a regex replace of the numbers for an HTML microformat that would look like the following:</p>

<pre><code>&lt;a href="tel:1234567891"&gt;12.34.56.78.91&lt;/a&gt;
</code></pre>

<p>The content of the anchor being the currently desired format. It would make it easy for anyone else needing to find all numbers, as they could now use an HTML parser.</p>

<h1 id="7-poker-feed">7. Poker Feed</h1>

<p>I'm not too sure what exactly I'm supposed to do. I did a bit of optimization in the original feed and then "translated" most important things and one title.</p>

<ul>
<li><a href="/static/interviews/thomson-reuters-bed/feed.en.json">feed.en.json</a></li>
<li><a href="/static/interviews/thomson-reuters-bed/feed.fr.json">feed.fr.json</a></li>
</ul>

<p>All static values are now "enum" values from the Configuration object at the top, which also contains lookup values for displaying in the language of the feed. Sorting can be done either on the enum name, or a quick dictionary lookup can be made to sort.</p>
</body></html>